#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#define SIG_ID 3

void signal_handler(int sig)
{
    std::cout << "[" << getpid() << "]" << "收到信号, sig:" << sig << std::endl; 
}

int main()
{
    // raise -- 向自身发送信号
    pid_t id = fork();
    if(id == 0)
    {
        // 子进程代码，发送信号
        int count = 0;
        while(true)
        {
            std::cout << "count:" << ++count << std::endl;
            sleep(1);
            if(count == 5) raise(SIG_ID);
        }

        exit(0);
    }

    int status = 0;  
    waitpid(id, &status, 0);   //阻塞等待子进程退出

    int core_dump = (status >> 7) & 1;
    int exit_sig = status & 0x7F;
    std::cout << "child process exit successful, core_dump:" << core_dump << ", exit_sig:" << exit_sig << std::endl;

    // kill 杀死的死循环 -- 通过给出进程id和信号编号发信号
    // while(true)
    // {
    //     std::cout << "This is a process, pid:" << getpid() << std::endl; 
    //     sleep(1);
    // }

    // pid_t id = fork();    
    // if(id == 0)
    // {
    //     while(true)
    //     {
    //         std::cout << "This is a child process, pid:" << getpid() << "  ppid:" << getppid() << std::endl;
    //         sleep(1);
    //     }

    //     exit(0);
    // }

    // // 验证子进程的核心转储标志位core dump
    // int status = 0;
    // waitpid(id, &status, 0);

    // std::cout << "core dump:" << ((status >> 7) & 1) << std::endl;

    // 重新注册信号处理方法
    // signal(SIGINT, signal_handler);
    // signal(SIGQUIT, signal_handler);

    // loop
    // while(true)
    // {
    //     std::cout << "This is a process, pid:" << getpid() << std::endl; 
    //     sleep(1);
    // }

    return 0;
}
